
generic
   type Item is private;
   with function "=" (X,Y : Item) return Boolean;
package Generic_Expression is

   type Expression_model is (Valeur, Unaire, Binaire);
   type Operateur_Unaire is ('-','+');
   type Operateur_Binaire is ('+','-','*','/');
   type P_Expression is access Expression_T;
   type Expression_T (Model : Expression_Model) is record
      case Model
         when Valeur => Val : Item;
         when Unaire =>
            Operator : Operateur_Unaire;
            Argument : P_Expression;
         when Binaire =>
            Avant : P_Expression;
            Operator : Operateur_Binaire;
            Apres : P_Expression;
      end case;
   end record;

   function "=" (X,Y: Expression_T) return Boolean ;

end Generic_Expression;
